package guijavacommander.tasks;

/**
 * User: Deady
 * Date: 16.07.2009
 * Time: 12:02:13
 */


import guijavacommander.tasks.Task;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * Диалоговое окно для ывполнения задач, требующих длительное время.
 * Задача - класс, реализующий интерфейс ThreadTask.
 * Задача запускается при вызове метода execute(): при этом в центре экрана
 * появляется диалоговое окно с анимированными часами слева и описанием задачи в центре.
 * После выполнения задачи окно исчезает.
 *
 * Способ запуска диалогового окна:
 * ThreadTask task = new ThreadTask() {
 *    public void execute() {
 *       System.out.println("Hello world");
 *    }
 *
 *    public String getDescription() {
 *       return "Testing";
 *    }
 * };
 * new ThreadDialog(panel, task).execute();


 * Данный способ с использованием интерфейса хорошо подходит для задач, которые не возвращают результат.
 * Если необходимо вернуть результат, можно воспользоваться абстрактным классом FeedbackThreadTask:
 * FeedbackThreadTask task = new FeedbackThreadTask() {
 *    public void execute() {
 *       System.out.println("Hello world");
 *       setFeedback(new Integer(1));
 *    }
 *
 *    public String getDescription() {
 *       return "Testing";
 *    }
 * };
 * new ThreadDialog(panel, task).execute();
 * Integer result = (Integer) task.getFeedback();
 *
 * User: Пеньков Владимир
 * Date: 13.12.2005
 * Time: 10:50:47
 */
public class ThreadDialog extends JDialog {

    private Task task = null;
    private JLabel clockLabel = new JLabel();
	private SwingWorker worker;
	private boolean started;

	/**
     * конструктор.
     * @param owner окно-владелец диалогового окна
     * @param task задание, которое требуется выполнить
     * @throws HeadlessException
     */
    public ThreadDialog(Frame owner, Task task) throws HeadlessException {
        super(owner, task.getDescription());
        init(task);
    }

	/**
     * конструктор.
     * @param owner окно-владелец диалогового окна
     * @param task задание, которое требуется выполнить
     * @throws HeadlessException
     */
    public ThreadDialog(Dialog owner, Task task) throws HeadlessException {
        super(owner, task.getDescription());
        init(task);
    }

    protected void init(Task task) {
        this.task = task;
        initGui(task);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        this.setModal(true);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                if (worker!=null) {
                    worker.interrupt();
                }
                dispose();
            }
        });
        //pack();

        worker = new SwingWorker() {

            public Object construct() {
                ThreadDialog.this.task.execute();
                return null;
            }


            @Override
            public void interrupt() {
                ThreadDialog.this.task.requestStop();
                super.interrupt();
            }

            public void finished() {
                setVisible(false);
                dispose();
            }
        };

        task.addDescriptionListener(new DescriptionListener() {
            public void descriptionUpdated(String description) {
                clockLabel.setText(description);
            }
        });
    }

    protected void initGui(Task task) {
        setSize(450, 100);
        clockLabel.setText(task.getDescription());
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(clockLabel, BorderLayout.CENTER);
    }

    /**
     * показывает диалог и запускает задачу на выполнение.
     */
    public void execute() {
        //WindowUtils.centerWindow(this);
		started = true;
		worker.start();
        setVisible(true);
    }

}
